package controllers

import (
	"encoding/json"
	"fmt"
	"ginstudydemo.com/main/models"
	"ginstudydemo.com/main/service"
	"github.com/gin-gonic/gin"
)

type IMenusController interface {
	UploadFile()
	GetMenus()
}

type MenusController struct{}

func NewMenusController() *MenusController {
	return &MenusController{}
}

// GetMenusRoutes 获取菜单路由列表
func (m MenusController) GetMenusRoutes(c *gin.Context) {
	//根据token获取用户信息
	claims, exists := c.Get("claims")
	if !exists {
		service.ReturnErr(c, "5005", "无法获取token信息")
		return
	}

	// 现在可以使用 claims 执行相关操作
	myClaims := claims.(*service.MyClaims)
	fmt.Println("------------")
	fmt.Println(myClaims.UserInfo.Roles)

	reData, modelErr := models.GetMenuRoutes(myClaims.UserInfo.Roles)
	if modelErr != nil {
		service.ReturnErr(c, "9999", "查询错误："+modelErr.Error())
		c.Abort()
		return
	}
	// 重组数据
	reDataNew := models.ConvertToRouteInfo(*reData, 0)
	// 生成树形结构数据
	treeData := models.GetTreeNodes(0, reDataNew)

	service.ReturnSuccess[[]models.RouteInfo](c, "2000", "ok", treeData)

}

// GetMenus 获取菜单列表
func (m MenusController) GetMenus(c *gin.Context) {

	var query models.GetMenusQuery
	// 获取查询参数（除分页参数）
	if sbqErr := c.ShouldBindQuery(&query); sbqErr != nil {
		service.ReturnErr(c, "9999", sbqErr)
		c.Abort() // 终止后续处理
		return    // 确保不会继续执行后续代码
	}

	res, modelErr := models.GetMenus(query)
	if !(modelErr == nil) {
		service.ReturnErr(c, "9999", "查询错误#"+modelErr.Error())
		c.Abort()
		return
	}

	treeRes := models.GetTreeNodesMenus(0, *res)

	service.ReturnSuccess[[]models.GetMenusRes](c, "2000", "用户ok", treeRes)

}

// GetMenusOptions 获取菜单下拉列表
func (m MenusController) GetMenusOptions(c *gin.Context) {

	res, modelErr := models.GetMenusOptions()
	if !(modelErr == nil) {
		service.ReturnErr(c, "9999", "查询错误#"+modelErr.Error())
		c.Abort()
		return
	}

	treeRes := models.GetTreeNodesMenusOptions(0, *res)

	service.ReturnSuccess[[]models.GetMenusOptionsRes](c, "2000", "用户ok", treeRes)

}

// GetMenusForm 获取菜单表单数据
func (m MenusController) GetMenusForm(c *gin.Context) {

	id := c.Param("id")

	res, modelErr := models.GetMenuInfoById(id)
	if !(modelErr == nil) {
		service.ReturnErr(c, "9999", "查询错误#"+modelErr.Error())
		c.Abort()
		return
	}

	// 将 JSON 解析为 map
	var data3 map[string]string
	err := json.Unmarshal([]byte(res.ParamsRaw), &data3)
	if err != nil {
		fmt.Println("解析 JSON 出错:", err)
		return
	}

	// 转换为指定格式
	//var result []map[string]string
	for key, value := range data3 {
		res.Params = append(res.Params, map[string]string{
			"key":   key,
			"value": value,
		})
	}

	//service.ReturnSuccess[[]map[string]string](c, "2000", "用户ok", result)

	service.ReturnSuccess[models.MenuFormRes](c, "2000", "用户ok", *res)

}

// AddMenus 新增菜单
func (m MenusController) AddMenus(c *gin.Context) {

	//使用数据表结构体获取参数
	param := &models.AddMenusBody{}
	// 把结构体指针传入BindJSON，这样param的值才能同步修改
	cErr := c.BindJSON(param)
	if !(cErr == nil) {
		service.ReturnErr(c, "5000", cErr)
		c.Abort()
		return
	}

	// 将 ParamsForm 转换为 JSON 字符串存储到 Params
	//if data, err := json.Marshal(param.ParamsForm); err == nil {
	//	param.Params = string(data)
	//} else {
	//	fmt.Println("转换出错:", err)
	//}

	// 转换为 map
	resultMap := make(map[string]string)
	for _, item := range param.ParamsForm {
		key := item.Key
		value := item.Value
		resultMap[key] = value
	}

	if data, err := json.Marshal(resultMap); err == nil {
		param.Params = string(data)
	} else {
		fmt.Println("转换出错:", err)
	}

	menuId, modelErr := models.AddMenus(*param)
	if !(modelErr == nil) {
		service.ReturnErr(c, "5000", modelErr)
		c.Abort()
		return
	}

	service.ReturnSuccess[int64](c, "2000", "用户ok", menuId)
}

// EditMenus 修改菜单
func (m MenusController) EditMenus(c *gin.Context) {

	ParamId := c.Param("id")

	//使用数据表结构体获取参数
	param := &models.AddMenusBody{}
	// 把结构体指针传入BindJSON，这样param的值才能同步修改
	cErr := c.BindJSON(param)
	if !(cErr == nil) {
		service.ReturnErr(c, "5000", cErr)
		c.Abort()
		return
	}

	// 将 ParamsForm 转换为 JSON 字符串存储到 Params
	//if data, err := json.Marshal(param.ParamsForm); err == nil {
	//	param.Params = string(data)
	//} else {
	//	fmt.Println("转换出错:", err)
	//}

	// 转换为 map
	resultMap := make(map[string]string)
	for _, item := range param.ParamsForm {
		key := item.Key
		value := item.Value
		resultMap[key] = value
	}

	if data, err := json.Marshal(resultMap); err == nil {
		param.Params = string(data)
	} else {
		fmt.Println("转换出错:", err)
	}

	modelErr := models.EditMenus(*param, ParamId)
	if !(modelErr == nil) {
		service.ReturnErr(c, "5000", modelErr)
		c.Abort()
		return
	}

	service.ReturnSuccess(c, "2000", "用户ok", struct{}{})
}

// DelMenus 删除菜单
func (m MenusController) DelMenus(c *gin.Context) {
	ids := c.Param("ids")

	if ids == "" {
		service.ReturnErr(c, "9999", "error:ids为空")
		c.Abort() // 终止后续处理
		return    // 确保不会继续执行后续代码
	}

	modelErr := models.DelMenus(ids)
	if !(modelErr == nil) {
		service.ReturnErr(c, "9999", "error:系统错误#"+modelErr.Error())
		c.Abort() // 终止后续处理
		return    // 确保不会继续执行后续代码
	}
	service.ReturnSuccess(c, "2000", "ok", struct{}{})
}
